home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Programming / LEDA / incl / LEDA.020+881 / line.h < prev    next >
C/C++ Source or Header  |  1994-08-05  |  3KB  |  115 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  3.1c
  4. +
  5. +
  6. +  line.h
  7. +
  8. +
  9. +  Copyright (c) 1994  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15. #ifndef LEDA_LINE_H
  16. #define LEDA_LINE_H
  17.  
  18. #include <LEDA/point.h>
  19. #include <LEDA/segment.h>
  20.  
  21. //------------------------------------------------------------------------------
  22. // straight lines
  23. //------------------------------------------------------------------------------
  24.  
  25. class line_rep : public handle_rep {
  26.  
  27. friend line;
  28.  
  29.   segment  seg; 
  30.  
  31. public:
  32.    
  33.   line_rep() {}
  34.   line_rep(const segment& s)  { seg = s; }
  35.  
  36.  ~line_rep() {}
  37.  
  38.   LEDA_MEMORY(line_rep)
  39.    
  40. };
  41.    
  42.  
  43. class line   : public handle_base 
  44. {
  45.  
  46. line_rep* ptr() const { return (line_rep*)PTR; }
  47.  
  48. public:
  49.  
  50.  line();
  51.  line(const segment&);
  52.  line(const point&, const point&);
  53.  line(const point&, double);
  54.  line(const line& l) : handle_base(l) {};
  55.  
  56. ~line() { clear(); }
  57.  
  58. line& operator=(const line& l) { handle_base::operator=(l); return *this; }
  59.  
  60.  
  61. bool intersection(const line& l, point& inter) const;
  62. bool intersection(const segment& s, point& inter) const;
  63.  
  64. bool vertical() const    { return ptr()->seg.vertical();  }
  65. bool horizontal() const  { return ptr()->seg.horizontal();}
  66. double distance() const  { return ptr()->seg.distance();  }
  67. double distance(point p) const { return ptr()->seg.distance(p); }
  68. double angle(const line& l) const { return ptr()->seg.angle(l.ptr()->seg); }
  69. double angle() const     { return ptr()->seg.angle();     }
  70. double direction() const { return angle(); }
  71. double slope() const     { return ptr()->seg.slope();     }
  72. segment seg()  const     { return ptr()->seg; }
  73.  
  74. segment perpendicular(const point& q) const;
  75.  
  76. line translate(double alpha, double d) const 
  77. { return ptr()->seg.translate(alpha,d); }
  78.  
  79. line translate(const vector& v)  const 
  80. { return ptr()->seg.translate(v); }
  81.  
  82. line rotate(const point& o, double alpha) const
  83. { return ptr()->seg.rotate(o,alpha); }
  84.  
  85. line rotate(double alpha) const  
  86. { return rotate(point(0,0),alpha);}
  87.  
  88. double y_proj(double x) const  { return ptr()->seg.y_proj(x); };
  89. double x_proj(double y) const  { return ptr()->seg.x_proj(y); };
  90. double y_abs() const { return ptr()->seg.y_proj(0); }
  91.  
  92. bool contains(const point&) const;
  93. bool contains(const segment&) const;
  94.  
  95. line operator+(const vector& v) const { return translate(v); }
  96.  
  97. int operator==(const line& l) const { return contains(l.ptr()->seg); }
  98. int operator!=(const line& l) const { return !contains(l.ptr()->seg); };
  99.  
  100. friend ostream& operator<<(ostream& out, const line& l);
  101. friend istream& operator>>(istream& in, line& l);  
  102.  
  103. };
  104.  
  105.  
  106. inline void Print(const line& l, ostream& out) { out << l; } 
  107. inline void Read(line& l, istream& in)         { in >> l; }
  108.  
  109. LEDA_HANDLE_TYPE(line)
  110.  
  111.  
  112.  
  113. #endif
  114.